﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Protell.Model.IRepository;
using Protell.Model;
using System.Collections.ObjectModel;

namespace Protell.ViewModel
{
    public class MenuViewModel :ViewModelBase
    {
        // ***************************** ***************************** *****************************
        // Repository. CATALOGOS
        private IMenu _MenuRepository;

        public MenuModel SelectedMenu
        {
            get { return _SelectedMenu; }
            set
            {
                if (_SelectedMenu != value)
                {
                    _SelectedMenu = value;
                    OnPropertyChanged(SelectedMenuPropertyName);
                }
            }
        }
        private MenuModel _SelectedMenu;
        public const string SelectedMenuPropertyName = "SelectedMenu";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<MenuModel> Menu
        {
            get { return _Menu; }
            set
            {
                if (_Menu != value)
                {
                    _Menu = value;
                    OnPropertyChanged(MenuPropertyName);
                }
            }
        }
        private ObservableCollection<MenuModel> _Menu;
        public const string MenuPropertyName = "Menu";

        // ***************************** ***************************** *****************************
        // Repository. PUNTO DE MEDICION
        private IPuntoMedicion _PuntoMedicionRepository;

        public PuntoMedicionModel SelectedPuntoMedicion
        {
            get { return _SelectedPuntoMedicion; }
            set
            {

                if (_SelectedPuntoMedicion != value)
                {
                    this.SelectedEstacion = null;
                    this.SelectedLumbrera = null;
                    _SelectedPuntoMedicion = value;
                    OnPropertyChanged(SelectedPuntoMedicionPropertyName);
                }
            }
        }
        private PuntoMedicionModel _SelectedPuntoMedicion;
        public const string SelectedPuntoMedicionPropertyName = "SelectedPuntoMedicion";

        public PuntoMedicionModel SelectedEstacion
        {
            get { return _SelectedEstacion; }
            set
            {
                if (_SelectedEstacion != value)
                {
                    this.SelectedPuntoMedicion = null;
                    this.SelectedLumbrera = null;
                    _SelectedEstacion = value;
                    OnPropertyChanged(SelectedEstacionPropertyName);
                }
            }
        }
        private PuntoMedicionModel _SelectedEstacion;
        public const string SelectedEstacionPropertyName = "SelectedEstacion";

        public PuntoMedicionModel SelectedLumbrera
        {
            get { return _SelectedLumbrera; }
            set
            {
                if (_SelectedLumbrera != value)
                {
                    this.SelectedPuntoMedicion = null;
                    this.SelectedEstacion = null;
                    _SelectedLumbrera = value;
                    OnPropertyChanged(SelectedLumbreraPropertyName);
                }
            }
        }
        private PuntoMedicionModel _SelectedLumbrera;
        public const string SelectedLumbreraPropertyName = "SelectedLumbrera";


        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<PuntoMedicionModel> PuntoMedicions
        {
            get { return _PuntoMedicions; }
            set
            {
                if (_PuntoMedicions != value)
                {
                    _PuntoMedicions = value;
                    OnPropertyChanged(PuntoMedicionsPropertyName);
                }
            }
        }
        private ObservableCollection<PuntoMedicionModel> _PuntoMedicions;
        public const string PuntoMedicionsPropertyName = "PuntoMedicions";

        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<PuntoMedicionModel> EstacionesPuntoMedicions
        {
            get { return _EstacionesPuntoMedicions; }
            set
            {
                if (_EstacionesPuntoMedicions != value)
                {
                    _EstacionesPuntoMedicions = value;
                    OnPropertyChanged(EstacionesPuntoMedicionsPropertyName);
                }
            }
        }
        private ObservableCollection<PuntoMedicionModel> _EstacionesPuntoMedicions;
        public const string EstacionesPuntoMedicionsPropertyName = "EstacionesPuntoMedicions";


        // Coleccion para extraer los datos para el grid.
        public ObservableCollection<PuntoMedicionModel> LumbrerasPuntoMedicions
        {
            get { return _LumbrerasPuntoMedicions; }
            set
            {
                if (_LumbrerasPuntoMedicions != value)
                {
                    _LumbrerasPuntoMedicions = value;
                    OnPropertyChanged(LumbrerasPuntoMedicionsPropertyName);
                }
            }
        }
        private ObservableCollection<PuntoMedicionModel> _LumbrerasPuntoMedicions;
        public const string LumbrerasPuntoMedicionsPropertyName = "LumbrerasPuntoMedicions";


        // Constructor y carga de elementos.
        public MenuViewModel()
        {
            this._PuntoMedicionRepository = new Protell.DAL.Repository.PuntoMedicionRepository();
            this._MenuRepository = new Protell.DAL.Repository.MenuRepository();
            this.LoadInfoGrid();
        }

        public void LoadInfoGrid()
        {
            this.Menu = this._MenuRepository.GetMenu() as ObservableCollection<MenuModel>;
            //this.PuntoMedicions = this._PuntoMedicionRepository.GetPuntoMedicions() as ObservableCollection<PuntoMedicionModel>;

            ObservableCollection<PuntoMedicionModel> res = this._PuntoMedicionRepository.GetPuntoMedicions() as ObservableCollection<PuntoMedicionModel>;
            
            this.PuntoMedicions=new ObservableCollection<PuntoMedicionModel>();
            try
            {
                (from o in res
                 orderby o.PuntoMedicionName ascending
                 where o.TIPOPUNTOMEDICION.IdTipoPuntoMedicion != 3 && o.TIPOPUNTOMEDICION.IdTipoPuntoMedicion !=1
                 select o).ToList().ForEach(p => this.PuntoMedicions.Add(p));
            }
            catch (Exception)
            {
            }

            this.EstacionesPuntoMedicions = new ObservableCollection<PuntoMedicionModel>();
            try
            {
                //where(o.TIPOPUNTOMEDICION != null) ? o.TIPOPUNTOMEDICION.IdTipoPuntoMedicion == 3 : false
                (from o in res
                 where o.TIPOPUNTOMEDICION.IdTipoPuntoMedicion == 3
                 select o).ToList().ForEach(p => this.EstacionesPuntoMedicions.Add(p));
            }
            catch (Exception)
            {
            }

            this.LumbrerasPuntoMedicions = new ObservableCollection<PuntoMedicionModel>();
            try
            {
                
                (from o in res
                 orderby o.PuntoMedicionName ascending
                 where o.TIPOPUNTOMEDICION.IdTipoPuntoMedicion == 1
                 select o).ToList().ForEach(p => this.LumbrerasPuntoMedicions.Add(p));
            }
            catch (Exception)
            {
            }

            this.SelectedPuntoMedicion= (from entity in this.PuntoMedicions select entity).First();
        }
    }
}
